# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_cors import CORS
from flask_jwt_extended import JWTManager
from .utils.response_utils import api_response, ResponseCode
import os
from flask_socketio import SocketIO  # 添加 SocketIO


# 导入配置类（修正的地方）
from app.config import Config,DevelopmentConfig,ProductionConfig  # 这行必须添加

# 创建扩展实例
db = SQLAlchemy()
migrate = Migrate()
jwt = JWTManager()
cors = CORS()  # 创建CORS实例而不是全局导入
socketio = SocketIO()  # 创建 SocketIO 实例


def create_app(config_class=Config):
    """应用工厂函数"""
    app = Flask(__name__, static_folder=None)

    # 加载配置
    # 根据环境变量选择配置
    env = os.environ.get('FLASK_ENV', 'development')
    if env == 'production':
        app.config.from_object(ProductionConfig)
        print("🚀 生产环境配置已加载")
    else:
        app.config.from_object(DevelopmentConfig)
        print("🔧 开发环境配置已加载")

    # 确保上传目录存在
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

    # 初始化扩展
    db.init_app(app)
    migrate.init_app(app, db)
    cors.init_app(app, supports_credentials=True)  # 正确初始化CORS
    jwt.init_app(app)
    socketio.init_app(  # 初始化 SocketIO
        app,
        cors_allowed_origins="*",  # 允许所有来源（生产环境应限制）
        async_mode='eventlet',     # 使用 eventlet 作为异步后端
        manage_session=False       # 不要管理会话
    )

    # 注册蓝图
    from app.routes.auth import auth_bp
    from app.routes.servers import servers_bp
    from app.routes.messages import messages_bp
    from app.routes.file import files_bp
    from app.routes.friend import friend_bp
    from app.routes.musics import music_bp

    app.register_blueprint(auth_bp, url_prefix='/api/auth')
    app.register_blueprint(servers_bp, url_prefix='/api/servers')
    app.register_blueprint(messages_bp, url_prefix='/api/messages')
    app.register_blueprint(files_bp, url_prefix='/api/files')
    app.register_blueprint(friend_bp, url_prefix='/api/friends')
    app.register_blueprint(music_bp, url_prefix='/api/musics')

    # 添加 SocketIO 事件处理
    from .sockets import register_socket_handlers
    register_socket_handlers(socketio)

    # 注册全局错误处理器
    @app.errorhandler(400)
    def handle_bad_request(error):
        return api_response(
            code=ResponseCode.PARAM_ERROR,
            message="请求参数不合法",
            http_code=400
        )

    @app.errorhandler(401)
    def handle_unauthorized(error):
        return api_response(
            code=ResponseCode.UNAUTHORIZED,
            message="未授权访问",
            http_code=401
        )

    @app.errorhandler(403)
    def handle_forbidden(error):
        return api_response(
            code=ResponseCode.PERMISSION_DENIED,
            message="没有访问权限",
            http_code=403
        )

    @app.errorhandler(404)
    def handle_not_found(error):
        return api_response(
            code=ResponseCode.RESOURCE_NOT_FOUND,
            message="资源不存在",
            http_code=404
        )

    @app.errorhandler(500)
    def handle_internal_server_error(error):
        # 记录错误日志
        app.logger.error(f"服务器错误: {error}")
        return api_response(
            code=ResponseCode.UNKNOWN_ERROR,
            message="服务器内部错误",
            http_code=500
        )

    # 添加数据库初始化的CLI命令
    with app.app_context():
        db.create_all()  # 确保创建所有表

    # 添加数据库初始化的CLI命令
    @app.cli.command('init-db')
    def init_db_command():
        """Initialize the database."""
        # 确保所有表已创建
        db.create_all()

        # 填充默认数据
        from app.utils.database import seed_default_data
        seed_default_data()
        print("Database initialized with default data.")

    return app